import request from '@/utils/request'
import JSEncrypt from 'jsencrypt';
import CryptoJS from 'crypto-js'



//RSA公钥 [此公钥用于登陆]
const rsaPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwX0nCnGP9QNiwDLfvGJY6p9jVpk3S9EI+nrClQhdymmQr/tVCttRGhu+a8pzVYQ9ygQcoH+gclh20Y4LHny75QlBqa2Lfiz14DEtprv3EUrV71JIinbrxh1zqyFodXWnLb+3Ez21ZdynDGEOTlXTxR5vdmK8hY1rWKED1RFzJhK4V6abP1WlsDcY52650LoW3usrxBr0Q19N6oUqmLfj0jSIbv3fWJgmwJxcPuVsIovZlkTe1RroEDSyks9fpcPA8wQ68O0useOkFCNlxV2eQXTU6TvTm7KdidlPGPK48ndjF0xOcXRb4wUe2gAp773fERuQNKK67nCpfMENRGfZMQIDAQAB"


// RSA生成密钥对
// /**
//  * 生成RSA密钥对 
//  * @returns 包含公钥和私钥的对象
//  * 公钥传给服务端 ，服务端据此公钥 对AES密钥进行加密 返回给前端
//  * 私钥用于解密 -> 服务端返回的AES加密后的密钥
//  */
export function generateKeyPair(): { publicKey: string; privateKey: string } {
    const encrypt = new JSEncrypt({ default_key_size: 2048 });
    // 生成密钥对
    encrypt.getKey(); // 这会自动生成新的 RSA 密钥对
    // 获取公钥和私钥
    const publicKey = encrypt.getPublicKey();
    const privateKey = encrypt.getPrivateKey();
    return {
        publicKey:publicKey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replace(/\n/g, "").trim(),
        privateKey:privateKey.replace("-----BEGIN PUBLIC KEY-----", "").replace("-----END PUBLIC KEY-----", "").replace(/\n/g, "").trim(),
    };

}

// /**
//  * RSA加密
//  * @param data 要加密的数据
//  * @param publicKey 公钥字符串
//  * @returns 加密后的Base64字符串
//  */
export function rsaEncrypt(data: string): string {
    const encryptor = new JSEncrypt();
    encryptor.setPublicKey(rsaPublicKey);
    let encryptedData = encryptor.encrypt(data);
    return encryptedData || '';
}


// /**
//  * RSA解密
//  * @param encryptedData 加密的Base64字符串
//  * @param privateKey 私钥字符串(PEM格式)
//  * @returns 解密后的原始字符串
//  */
export function rsaDecrypt(encryptedData: string, privateKey: string): string {
    const decryptor = new JSEncrypt();
    decryptor.setPrivateKey(privateKey);
    return decryptor.decrypt(encryptedData) || '';
}

// 登录方法 获取令牌(获取AES密钥)
export function getAesKey(publicKey:Object) {
    return request({
        url: '/cz-system/api/v1/secretKeys/getAesEncryptKey',
        method: 'POST',
        data: publicKey
    })
}

// Base64 编码
function encodeBase64(str: string): string {
    return btoa(unescape(encodeURIComponent(str)));
  }
  
// Base64 解码
function decodeBase64(str: string): string {
    return decodeURIComponent(escape(atob(str)));
}


//   AES-256-CBC加解密

//  /**
//    * AES 加密方法
//    * @param plaintext 明文字符串
//    * @param base64Key Base64编码的密钥(32字节)
//    * @param base64Iv Base64编码的IV(16字节)
//    * @returns Base64编码的密文字符串
//    */

export function aesEncrypt(plaintext: string, base64Key: string, base64Iv: string): string { 
    try{
        // Base64 解码
        const key = CryptoJS.enc.Base64.parse(base64Key);
        const iv = CryptoJS.enc.Base64.parse(base64Iv);
        // 验证密钥长度
        if (key.sigBytes !== 32) {
            throw new Error("密钥长度必须为32字节（256位）");
        }

        // 验证IV长度
        if (iv.sigBytes !== 16) {
            throw new Error("IV长度必须为16字节（128位）");
        }
        const encrypted = CryptoJS.AES.encrypt(
            plaintext,
            key,
            {
                iv: iv, 
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7 
            });
        return encrypted.toString();
    }catch(e){
        console.log("ERROR:",e)
    }

}

//  /**
//    * AES 解密方法
//    * @param base64CipherText Base64编码的密文
//    * @param base64Key Base64编码的密钥（32字节）
//    * @param base64Iv Base64编码的IV（16字节）
//    * @returns 解密后的明文字符串
//    */
export function aesDecrypt(cipherText: string, base64Key: string, base64Iv: string): string{ 
    try{
        // Base64 解码
        // const cipherText1 = CryptoJS.enc.Base64.parse(cipherText);
        const key = CryptoJS.enc.Base64.parse(base64Key);
        const iv = CryptoJS.enc.Base64.parse(base64Iv);
        // 验证密钥长度
        if (key.sigBytes !== 32) {
            throw new Error("密钥长度必须为32字节（256位）");
        }

        // 验证IV长度
        if (iv.sigBytes !== 16) {
            throw new Error("IV长度必须为16字节（128位）");
        }
        const decrypted = CryptoJS.AES.decrypt(
            cipherText, 
            key, 
            {
                iv: iv,
                mode: CryptoJS.mode.CBC,
                padding: CryptoJS.pad.Pkcs7
            });
        return decrypted.toString(CryptoJS.enc.Utf8);
    }catch(e){
        console.log("ERROR:",e)
    }
}
// private String yardTel;
// private String publisherTel;
// private String tel;
// private String agentUserTel;
// private String boxEastUserTel;
// private String boxEastOperatorUserTel;

// // 法人身份证号
// private String identityNo;

// // 法人手机号
// private String mobile;

// //管理员身份证号
// private String userIdentityNo;

// // 管理员手机号
// private String userMobile;

// // 联系人手机号
// private String tel;

// // 集装箱公司经办人电话
// private String boxEastUserTel;

// // 集装箱公司操作员电话
// private String boxEastOperatorUserTel;

// // 签署人电话
// private String boxEastOperatorUserTel;

// // 货代经办人电话
// private String agentUserTel;

// // 售箱签署人电话
// private String saleSignTel;

//【手机号集合】 在此集合中的字段 不进行加/解密
const fieldsCollection = ["yardTel","publisherTel","tel","agentUserTel","boxEastUserTel","boxEastOperatorUserTel","identityNo","mobile","userIdentityNo","userMobile","saleSignTel",'idNo'] // 只有在这个数组内的字段才会进行加解密
export function checkFields(field){
   return fieldsCollection.includes(field)
}
//【时间集合】 在此集合中的字段 不进入递归处理
const fieldsTime = ["inDate","outDate","beginInDate","endInDate","beginOutDate","endOutDate","beginCreateDate","endCreateDate",
    "planPickupDate","productionDateStart","productionDateEnd","packingValidityPeriodEnd","packingValidityPeriodStart","packingDate",
    "returnValidityPeriodEnd","returnValidityPeriodStart","returnDate","payDate","sellDate","endDataTime","beginDataTime","buyDate",
    "beginBuyDate","endBuyDate","beginPackingDate","endPackingDate","beginCreateTime","endCreateTime","beginPlanPickupDate","endPlanPickupDate",
    "beginReturnDate","endReturnDate","beginPayDate","endPayDate",]
export function checkTime(time) {
    return fieldsTime.includes(time) 
}
//【接口集合】 在此集合中的几口 不进行加/解密处理
const apiList = [""]
export function checkApi(api) {
    return apiList.includes(api) 
}
